import ru.niir.goodfil.db.GoodfilFactory
import org.apache.poi.hssf.usermodel.HSSFWorkbook
import ru.niir.goodfil.db.GoodType
import ru.niir.goodfil.db.Good

/*НИИР - G, Home - E, GW - C*/
baseDir = "G:\\Documents and Settings\\Admin\\Рабочий стол\\gw_goods";
prices = ["Воздушные.xls", "Масляные.xls", "Топливные.xls", "Салонные.xls", "Щетки.xls"]

gf = GoodfilFactory.instance;

wb = new HSSFWorkbook(new FileInputStream("${baseDir}\\goods_real.xls"));
sheet = wb.getSheetAt(0);

columns = [:]
row0 = sheet.getRow(0);
for (i = 0; i < row0.lastCellNum; i++)
{
  cell = row0.getCell(i);
  columns[cell.stringCellValue] = i;
}


goodTypes = gf.getGoodTypes();
badGoodTypes = [];
mask = ["корпусные":"Щетки стелоочистителей корпусные (стандарт)",
        "корпусные (для грузовых автомобилей)":"Щетки стеклоочистителей корпусные (стандарт) для грузовых автомобилей, автобусов и т.д.",
        "AG":"Воздушные/салонные фильтры",
        "стеклоочистительные клипсы":"Cтеклоочистительные клипсы GW",
        "Свечи зажигания GW":"Свечи зажигания GW",
        "FG":"Топливные фильтры",
        "OG":"Масляные фильтры",
        "сменные лезвия":"Сменные лезвия",
        "безкорпусные":"Щетки стеклоочистителей безкорпусные",
        "Аксессуары GW":"Аксессуары GW",
        "Каталоги":"Каталоги GW",
        "Турбо Старт GW":"Турбо Старт GW"];

def long findGoodType(name)
{
  for (goodType in goodTypes)
    if (goodType.name == name)
      return goodType.id;
  return -1;
}

err_cnt = 0;
nocodes_goods = [];
goods = []

for (i = 1; i < sheet.lastRowNum; i++)
{
  row = sheet.getRow(i);
  String goodCode1C = new Integer((int)row.getCell(columns['goodCode1C']).numericCellValue).toString();
  goodCodeIS        = row.getCell(columns['Kod']).stringCellValue.toString();
  name              = row.getCell(columns['Naimenovanie']).stringCellValue;
  isGoodType        = row.getCell(columns['Gryppa']).numericCellValue;
  parentGoodType    = row.getCell(columns['RoditelGryppa']).stringCellValue;
  goodTypeName      = row.getCell(columns['Roditel']).stringCellValue;

  if (isGoodType) continue;

  //
  //  Проверяем корректность группы товаров
  //

  if (mask.containsKey(goodTypeName)) goodTypeName = mask[goodTypeName];
  else
  {
    println "- ${i} ${goodTypeName}";
    System.exit 0;
  }

  if (goodTypeName == "")
  {
    println "-- ${i} ${row}";
    System.exit 0;
  }

  found = false;
  for (GoodType goodType in goodTypes)
    if (goodType.name.equals(goodTypeName)) found = true;

  if (!found) badGoodTypes.add(goodTypeName);

  //  ---------------------------------------------------------------------

  //
  //  Нормализация кода и кода 1С -----------------------------------------
  //

  code = goodCodeIS;

  code = code
        .replaceAll("  ", " ")
        .trim()
        .toUpperCase()
        .replaceAll("А", "A")
        .replaceAll("В", "B")
        .replaceAll("Е", "E")
        .replaceAll("К", "K")
        .replaceAll("М", "M")
        .replaceAll("Н", "H")
        .replaceAll("О", "O")
        .replaceAll("Р", "P")
        .replaceAll("С", "C")
        .replaceAll("Т", "T")
        .replaceAll("У", "Y")
        .replaceAll("Х", "X");

  //  Выводим товары без кода
  if (code == "")
  {
    code = "ERR_" + err_cnt;
    err_cnt++;
    println "no_code;${name}";
  }

  code = code.replaceAll("  ", " ");

  if (goodCode1C.length() == 1) goodCode1C = "0000000" + goodCode1C;
  if (goodCode1C.length() == 2) goodCode1C = "000000" + goodCode1C;
  if (goodCode1C.length() == 3) goodCode1C = "00000" + goodCode1C;
  if (goodCode1C.length() == 4) goodCode1C = "0000" + goodCode1C;
  if (goodCode1C.length() == 5) goodCode1C = "000" + goodCode1C;
  if (goodCode1C.length() == 6) goodCode1C = "00" + goodCode1C;
  if (goodCode1C.length() == 7) goodCode1C = "0" + goodCode1C;

  //  --------------------------------------------------------------------------------------

  Good good = new Good();
  good.code = code;
  good.name = name;
  good.c1code = goodCode1C;
  good.goodTypeId = findGoodType(goodTypeName);
  good.minPrice = 1;
  goods.add(good);
}


//  Выводим список отсутствующих групп
println "Bad goodTypes: ${(badGoodTypes as Set).size()}"
for (badGoodType in (badGoodTypes as Set))
  println "  * ${badGoodType}";

if (badGoodTypes.size() > 0) System.exit(0);

//  Выводим все коды товаров в файл c1_goods_codes.txt
File codesFile = new File("${baseDir}\\c1_goods_codes.txt");
codesFile << goods.collect { it.code }.join(",");

//  Формируем список кодов несоответствий между 1С и прайсом
badPricelistCodes = [];
for (String pricelist in prices)
{
  println "Processing ${pricelist}";
  wb = new HSSFWorkbook(new FileInputStream("${baseDir}\\${pricelist}"));
  sheet = wb.getSheetAt(0);

  columns = [:]
  row0 = sheet.getRow(0);
  for (i = 1; i < sheet.lastRowNum; i++)
  {
    code = sheet.getRow(i).getCell(0).stringCellValue;

    code = code.toUpperCase();
    code = code.replaceAll("  ", " ")
                .trim()
                .toUpperCase()
                .replaceAll("А", "A")
                .replaceAll("В", "B")
                .replaceAll("Е", "E")
                .replaceAll("К", "K")
                .replaceAll("М", "M")
                .replaceAll("Н", "H")
                .replaceAll("О", "O")
                .replaceAll("Р", "P")
                .replaceAll("С", "C")
                .replaceAll("Т", "T")
                .replaceAll("У", "Y")
                .replaceAll("Х", "X");
    boolean found = 0;
    for (Good good in goods)
      if (good.code == code) found = 1;
    if (!found)
    {
      badPricelistCodes << code;
    }
  }
}

//  Выводим отсутствующие
println "Bad pricelist codes: ${badPricelistCodes.size()}";
for (String badPricelistCode in badPricelistCodes)
  println "bad_pricelist_code;${badPricelistCode};";

println "finished";

gf.clearGoodsData();
println "saving";

for (Good good in goods)
{
    gf.saveGood(good);
}
println "saved";

